package com.bzkj.basicinfo.service.warehouse;

import com.bzkj.basicinfo.domain.warehouse.BarRelation;
import com.bzkj.basicinfo.domain.warehouse.dto.BarRelationRequest;
import com.bzkj.basicinfo.domain.warehouse.dto.BarRelationResponse;

import java.util.List;
import java.util.Map;

/**
 * 条码关系Service接口
 *
 * @author lixinyu
 * @date 2025-06-30
 */
public interface IBarRelationService {

    /**
     * 调用外部SOAP接口查询条码关系
     *
     * @param request 查询请求
     * @return 查询响应
     */
    BarRelationResponse queryBarRelationFromSoap(BarRelationRequest request);

    /**
     * 调用外部接口查询码关系并保存单据、明细、追溯码信息
     *
     * @param request 查询请求
     * @return 查询响应，包含单据ID
     */
    Map<String, Object> queryCodeRelationAndSave(BarRelationRequest request);

    /**
     * 根据追溯码查询条码关系
     *
     * @param barCode 追溯码
     * @return 条码关系列表
     */
    List<BarRelation> selectBarRelationsByBarCode(String barCode);

    /**
     * 查询所有条码关系
     *
     * @return 条码关系列表
     */
    List<BarRelation> selectAllBarRelations();

    /**
     * 根据当前码列表查询条码关系
     *
     * @param curCodes 当前码列表
     * @return 条码关系列表
     */
    List<BarRelation> selectBarRelationsByCurCodes(List<String> curCodes);

    /**
     * 删除条码关系数据
     *
     * @param curCodes 当前码列表
     * @return 删除成功的数量
     */
    int deleteBarRelationsByCurCodes(List<String> curCodes);

    /**
     * 检查追溯码是否已存在
     *
     * @param barCode 追溯码
     * @return 是否存在
     */
    boolean checkBarCodeExists(String barCode);

    /**
     * 根据追溯码查询相关的单据ID
     *
     * @param barCode 追溯码
     * @return 单据ID列表
     */
    List<String> getBillsIDsByBarCode(String barCode);

    /**
     * 根据单据ID查询条码关系
     *
     * @param billsID 单据ID
     * @return 条码关系列表
     */
    List<BarRelation> selectBarRelationsByBillsID(String billsID);

    /**
     * 检测追溯码的级别
     *
     * @param barCode 追溯码
     * @return 码级别（1、2、3等）
     */
    String detectCodeLevel(String barCode);

    /**
     * 根据输入码级别查询对应的下级码
     *
     * @param barCode 输入的追溯码
     * @return 下级码关系列表
     */
    List<BarRelation> selectChildCodesByInputCode(String barCode);

    /**
     * 根据父级码查询直接子码
     *
     * @param parentCode 父级码
     * @return 子码关系列表
     */
    List<BarRelation> selectDirectChildCodes(String parentCode);

    /**
     * 根据追溯码查询完整的关联关系（包括输入码本身和所有相关码）
     *
     * @param barCode 追溯码
     * @return 完整的条码关系列表
     */
    List<BarRelation> selectCompleteBarRelationsByBarCode(String barCode);

    /**
     * 根据输入码获取初始显示的码列表（输入码本身）
     *
     * @param barCode 输入的追溯码
     * @return 输入码信息
     */
    List<BarRelation> getInitialCodeDisplay(String barCode);
}
